<?php
/**
 * @package mm_my
 * @subpackage Controller
 */

/**
 * Основний клас контроллеру, від нього наслідуються усі інші
 * @package mm_my
 * @subpackage Controller
 */
class Controller_Main extends Zend_Controller_Action
{
    /**
     * конфіг
     * @var Zend_Config
     */
    protected $config = null;

    /**
     * кеш
     * @var Memcache
     */
    protected $cache = null;
    
    /**
     * чи підключено до кешу
     */
    private $_cacheConnected = false;
    
    /**
     * завантажує конфіг
     */
    public function init() {
        if (is_null($this->config)) {
            $this->config = new Zend_Config_Ini(APPLICATION_PATH . "/configs/application.ini",
                                                APPLICATION_ENV);
            $this->cache = new Memcache;
            
            Zend_Registry::set('config', $this->config);
            Zend_Registry::set('cache', $this->cache);
        }
        parent::init();
    }
    
    /**
     * Отримання класу кешу
     */
    protected function cache() {
        if (!$this->_cacheConnected) {
            $this->cache->connect($this->config->cache->host, 
                                  $this->config->cache->port);
            Zend_Registry::set('cache', $this->cache);
        }
        return $this->cache;
    }
    
    /**
     * Имя класса для объекта меню
     * @var string
     */
    protected $_navigationClass = 'Navigation';

    /**
     * Объект меню
     * @var Zend_Navigation
     */
    protected $_navigation;

    /**
     * Создаёт объект меню, если он ещё не создан.
     * @return Zend_Navigation|null
     */
    protected function _getNavigation()
    {
        if($this->_navigationClass && is_null($this->_navigation)){
            $this->_navigation = new $this->_navigationClass;
        }

        return $this->_navigation;
    }

    /**
     * Помещает в вид данные о навигации
     *
     * @see Zend_Controller_Action::preDispatch()
     */
    public function preDispatch()
    {
        if($this->view instanceof Zend_View_Abstract){
            Zend_Dojo::enableView($this->view);

            $this->view->addHelperPath('Zend/Dojo/View/Helper', 'Zend_Dojo_View_Helper');

            if ($this->_getNavigation()){
                $this->view->navigation($this->_getNavigation());
            }
        }
    }
    
    /**
     * Переводит и добавляет сообщение типа "заметка"
     * в пространство имён notices flashMessenger-a
     *
     * @param string $message
     * @return Controller_Main
     */
    public function addNotice($message)
    {
        $options = func_get_args();
        array_shift($options);
        
        if($message){
            $this->_helper->getHelper('flashMessenger')->setNamespace('notices')
                                  ->addMessage($this->view->translate($message, $options));
        }

        return $this;
    }

    /**
     * Переводит и добавляет сообщение типа "ошибка"
     * в пространство имён errors flashMessenger-a
     *
     * @param string $message
     * @return Controller_Main
     */
    public function addError($message)
    {
        $options = func_get_args();
        array_shift($options);

        if($message){
            $this->_helper->getHelper('flashMessenger')->setNamespace('errors')
                                  ->addMessage($this->view->translate($message, $options));
        }

        return $this;
    }

    /**
     * Переводит и добавляет сообщение типа "успех"
     * в пространство имён successess flashMessenger-a
     *
     * @param string $message
     * @return Controller_Main
     */
    public function addSuccess($message)
    {
        $options = func_get_args();
        array_shift($options);

        if($message){
            $this->_helper->getHelper('flashMessenger')->setNamespace('successes')
                                  ->addMessage($this->view->translate($message, $options));
        }

        return $this;
    }
}
